import javax.xml.soap.Node;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;


public class LinkedList {
    private final GoodsLinkNode head = new GoodsLinkNode(100, "张", 0, "1", "1","0");


    //添加结点到单向链表
    //当不考虑编号顺序时
    //1、找到当前链表的最后结节点
    //2、将最后这个节点的next 指向 新的结点
    public void add(GoodsLinkNode goodsNode) {
        //因为head节点不能动，因此我们需要一个辅助遍历的节点  temp
        GoodsLinkNode temp = head;
        //找到
        while (temp.next != null) {
            //找到链表的最后的节点
            //如果遍历的当前结点不是尾结点，将temp节点向后移动
            temp = temp.next;
        }
        //当退出while循环时，表示temp就指向了链表的尾节点
        temp.next = goodsNode;
    }

    //第二种添加方式，在添加商品时根据编号将商品插入到指定位置
    public void addByNumber(GoodsLinkNode goodsNode) {
        //因为头节点不能动，因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
        //因为是单链表，我们找的temp是位于添加位置的前一个节点，否则插入不了
        GoodsLinkNode temp = head;
        boolean flag = false;//flag标志添加的编号是否存在，默认为false
        while (true) {
            if (temp.next == null) //说明temp已经在链表的最后
            {
                break;
            }
            if (temp.next.number > goodsNode.number)//位置找到，就在temp的后面插入
            {
                break;
            } else if (temp.next.number == goodsNode.number)//说明想要添加的
            {
                flag = true;//说明编号存在
                break;
            }
            temp = temp.next;//后移
        }
        //判断flag的值
        if (flag) {   //不能添加，说明编号存在
            System.out.println("准备添加商品的编号:" + goodsNode.number + "已经存在不能添加了");
        } else {
            //插入到链表中，temp的后面
            goodsNode.next = temp.next;
            temp.next = goodsNode;
        }
    }

    //遍历链表
    public void showlist() {
        //判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        //因为头节点，不能动，因此我们需要一个辅助变量来遍历
        GoodsLinkNode temp = head.next;
        while (temp != null) {
            //判断是否到链表最后
            //输出节点的信息
            System.out.print(temp);//前面GoodsLinkNode类中已经重写toString方法
            System.out.println();
            //将temp后移
            temp = temp.next;
        }
    }

    //返回链表中共有多少个商品的信息
    public int len() {
        int count = 0;
        //判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空");
            return 0;
        }
        //因为头节点，不能动，因此我们需要一个辅助变量来遍历
        GoodsLinkNode temp = head.next;
        while (temp != null) {
            //判断是否到链表最后
            //输出节点的信息
            count++;
            //将temp后移
            temp = temp.next;
        }
        return count;

    }

    //删除结点：根据商品编号删除指定商品结点
    //1、head不能动，因此我们需要一个temp辅助节点找到待删除节点的前一个节点
    //2、说明我们在比较时，是temp.next.number和需要删除的节点的number比较
    public void delete(int number) {
        GoodsLinkNode temp = head;
        boolean flag = false;//标志是否找到待删除的节点
        while (true) {
            if (temp.next == null) {
                break;//已经到链表的最后
            }
            if (temp.next.number == number) {
                //找到待删除的节点的前一个节点temp
                flag = true;
                break;
            }
            temp = temp.next;//temp后移，遍历
        }
        //判断flag
        if (flag) {//找到
            //可以删除
            temp.next = temp.next.next;
        } else {
            System.out.println("编号" + number + "的商品不存在");
        }
    }

    //修改节点信息，根据number 编号来修改
    public void update(GoodsLinkNode goodsNode) {
        //判断是否为空
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        //找到需要修改的节点，根据number编号
        //定义一个辅助变量
        GoodsLinkNode temp = head.next;
        boolean flag = false;//表示是否找到该节点
        while (true) {
            if (temp == null) {
                break;//已经遍历完链表
            }
            if (temp.number == goodsNode.number)//找到
            {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        //根据flag判断是否找到要修改的节点
        if (flag) {
            temp.name = goodsNode.name;
            temp.price = goodsNode.price;

        } else {
            System.out.println("没有找到编号为" + goodsNode.number + "的商品");
        }
    }

    //查询指定生产日期的商品个数，并输出查询的商品信息
    public void getbyDate(String date) {
        GoodsLinkNode temp = head;
        int count = 0;
        System.out.println("分类为" + date + "的商品有：");
        while (temp != null) {
            if (temp.describe.equals(date)) {
                count++;
                System.out.println("编号：" + temp.number + "名称：" + temp.name);
            }
            temp = temp.next;
        }
        System.out.println("共上面" + count + "个");
    }

    public void InMemory() {
        GoodsLinkNode temp = head;

        GoodsLinkNode apple = new GoodsLinkNode(1001, "苹果", 3, "水果", "100", "2022-12-1");

        GoodsLinkNode pear = new GoodsLinkNode(1002, "梨子", 4, "水果", "70", "2022-7-12");

        GoodsLinkNode peach = new GoodsLinkNode(1003, "桃子", 2, "水果", "89", "2022-11-2");

        GoodsLinkNode meat = new GoodsLinkNode(1004, "猪肉", 23, "肉类", "89", "2022-12-2");

    }

    public String ByDate() {
        GoodsLinkNode temp = head;
        Date date0 = new Date();
        Date date1 = new Date(date0.getTime() - 45L * 24 * 60 * 60 * 1000);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date2 =  new Date(temp.date);
        if (date1.compareTo(date2) >= 0) {

            System.out.println("商品将要过期");

        } else if (date1.compareTo(date2) < 0) {

            System.out.println("商品未过期");

        } return temp.date;

    }


}